// Permet d'interpreter les instructions dans le fichier donné

#ifndef LECTEURPHRASEAVECARBRE_H_
#define LECTEURPHRASEAVECARBRE_H_

#include <string>
using namespace std;

#include "Symbole.h"
#include "LecteurSymbole.h"
#include "TableSymboles.h"
#include "Arbre.h"

class LecteurPhraseAvecArbre
{
public:
                LecteurPhraseAvecArbre(string nomFich); // Constructeur

                void analyse();
                // Si => Le contenu du fichier est conforme à la grammaire 
                // Affiche un message "Syntaxe correcte". La table des symboles (ts) et l'arbre abstrait (arbre) auront été construits
                // Sinon => Le programme sera interrompu (exit).

                inline TableSymboles getTs () { return ts; } // accesseur	
                inline Noeud* getArbre () { return arbre; } // accesseur
	
private:
                LecteurSymbole ls;         // le lecteur de symboles utilisé pour analyser le fichier
                TableSymboles  ts;         // la table des symboles valués
                Noeud*  arbre;               // l'arbre abstrait

                Noeud* programme();  // <programme> ::= debut <seqInst> fin FIN_FICHIER
                Noeud* seqInst();         // <seqInst> ::= <inst> ; { <inst> ; }
                Noeud* inst();               // <inst> ::= <affectation>
    
                Noeud* affectation();    // <affectation> ::= <variable> = <expression>
                Noeud* instSi();            // <instSi> ::= si ( <expBool> ) <seqInst> { sinonsi ( <expBool> ) <seqInst> } [ sinon <seqInst> ] finsi
                Noeud* instTq();           // <instTq> ::= tantque ( <expBool> ) <seqInst> fintantque
                Noeud* instPour();       // <instPour> ::= pour (<affectation> <expBool> <affectation>) <seqInst> finpour
                Noeud* instRepeter();  // <instRepeter> ::= repeter <seqInst> jusqua ( <expBool> )
                Noeud* instLire();        // <instLire> ::= lire ( <variable> )   
                Noeud* instEcrire();    // <instEcrire> ::= ecrire ( <expression> | <chaine> ) 
                Noeud* instSelon();    //<instSelon> ::= selon (<variable>) { cas <entier> : <seqInst> } defaut : <seqInst> finselon

                Noeud* expression(); // <expression> ::= <facteur> { <opBinaire> <facteur> }
                Noeud* expBool();     // <expBool> ::= <relation> { <opBool> <relation> }
                Noeud* facteur();      // <facteur> ::= <entier>  |  <variable>  |  - <facteur>  |  ( <expression> )
                Noeud* chaine();
                Noeud* relation();     // <relation> ::= <expression> { <opRel> <expression> }
                Noeud* terme();        //<terme> ::= <facteur> { <opMult> <facteur> }

                Symbole opMult();      // <opMult>  ::= *  | /
                Symbole opAdd();      // <opAdd>  ::= + | -
                Symbole opBool();     // <opBool> ::= et | ou  
                Symbole opRel();       // <opRel> ::= == | != | < | <= | > | >=
                Symbole opUnaire(); // <opUnaire> ::= non  

                void testerSymCour (string ch); // si symbole courant != ch, erreur : on arrete le programme, sinon rien
                void sauterSymCour (string ch); // si symbole courant == ch, on passe au symbole suivant, sinon erreur : on arrete
                void erreur (string mess); // affiche les message d'erreur mess et arrete le programme
};

#endif /* LECTEURPHRASEAVECARBRE_H_ */
